/*
输入一个大于 3 的整数 n ，判定它是否素数（ prime ，又称质数）。
思路：
- 让 n 被 i 整除（ i 的值从 2 变到 n-1 ）
- 如果 n 能被 2 ~ (n-1) 之中任何一个整数整除，则表示 n 肯定不是素数，不必再继续被后面的数整数除，因此可以提前结束循环。（不需要判断 n / 2 之上的数字，只要判断 2 3 4 5）
- 注意：此时 i 的值必然小于 n 。
过程：
1. 输入n
2. i = 2
3. i ≤ n - 1 : N → 6.
4. n 被 i 整除 : Y → 6.
5. i = i + 1 : → 3.
6. i ≤ a : Y → 不是素数, N → 是素数

输出 1-100 之间所有的素数：
*/
#include <stdio.h>
int main()
{
    int i, n, m;
    // 1 2 就不用了
    for (n = 3; n <= 100; n++)
    {
        m = n / 2; // 也可以用开方 m = sqrt(n);
        // i 已经到达 n / 2 ，则退出循环
        // 能不能被 i 整除，如果能则退出循环
        for (i = 2; i <= m; i++)
            if (n % i == 0)
                break;
        // 如果循环执行完成了（非 break ），则是素数
        if (i > m)
            printf("%5d", n); // %5d 指定位数 自动加空格
    }
    return 0;
}
/*
也可以用开方 m = sqrt(n) 的解释：
64
<---|
2 4 8 16 32 (2-32)
<------|
    4  8 12 16
----+--+--+--+-->
64 的约数一共有 2 4 8 16 32 这 5 个数
64的开平方是 8 16 32 都在开平方的右边
在其左边分别有两个因数 在其开平方的左边对应
而判断一个数是否为质数，只需要找到一个除了本身之外的其他因数即可。
所以我们找到开平方数就可以了。
如果一个数的约数在其开平方的右边，则必然会存在一个约数在其开平方的左边。
*/